home *** CD-ROM | disk | FTP | other *** search
- { I made a small ASM-routine for accessing 4 GB data in 4 instructions: }
-
- PROGRAM test32; {Works for TPW1.5}
- {$R-}
- {Wim Smit 4-9-1994
- Thanx to Jimmy Athens!}
- USES WinTypes,WinProcs,WinCrt;
- TYPE
- word_array = ARRAY[0..0] OF WORD;
- Pword_array = ^word_array;
-
- VAR P:PWORD_Array;
- H:THandle;
- sub1,sub2,
- segt: WORD;
- i,
- ofst: LONGINT;
- BEGIN
- WRITELN('BEGIN');
-
- h := GlobalAlloc(GMEM_MOVEABLE OR GMEM_SHARE,2*70000);
- IF (h = 0) THEN
- Halt;
- P := GlobalLock(h);
- IF (P = NIL) THEN
- Halt;
-
- segt := SEG(p^);
- FOR i := 0 TO 69999 DO {fill the words with their index}
- BEGIN
- ASM
- mov es,segt
- db 66h {66h for 386 opcode}
- mov bx, WORD(i) {WORD() to fool Pascal}
- db 66h
- shl bx,1 {ebx times 2: WORDs}
- db 66h
- mov ax, WORD(i)
- db 26h
- db 67h
- db 89h
- db 03h {these produce: mov es:[ebx],ax}
- END;{asm}
- END;{i}
- {Now test it by reading the words:}
- FOR i := 32762 to 32770 DO {read over a segment-boundary}
- BEGIN
- ASM
- mov es,segt
- db 66h
- mov bx, WORD(i) {= mov ebx, i}
- db 66h
- shl bx,1 {times 2: we're indexing WORDs}
- db 26h
- db 67h
- db 8bh
- db 03h {= mov ax, es:[ebx]}
- mov sub2, ax
- END;{asm}
- sub1 := p^[i];
- WRITELN(i:3,':',sub2,' ',sub1);
- END;{i}
-
- GlobalUnlock(h);
- GlobalFree(h);
- WRITELN('DONE');
- END.
-
- {
- Run the program and see the difference:
- BEGIN
- 32762:32762 32762
- 32763:32763 32763
- 32764:32764 32764
- 32765:32765 32765
- 32766:32766 32766
- 32767:32767 32767
- 32768:32768 0 <-Here 16 bit index will wraparound to p^[0]!
- 32769:32769 1
- 32770:32770 2
- DONE
-
- Thus, by choosing the right db's, one can access huge arrays of bytes,
- words and longints etc.
- Isn't that great?
- OK, it needs a 386 or better, but don't we all have that?
- }